package com.english.controller;

import com.english.entity.Banner;
import com.english.service.BannerService;
import com.english.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;

/**
 * 文件上传控制器
 * 处理轮播图等图片文件的上传
 * 
 * @author wlq
 * @since 2025-08-05
 */
@RestController
@RequestMapping("/api/upload")
@CrossOrigin(origins = "*", allowCredentials = "false", maxAge = 3600)
public class FileUploadController {
    
    @Value("${upload.banner.path:src/main/resources/static/images/banner}")
    private String uploadPath;
    
    @Value("${upload.banner.url-prefix:/images/banner}")
    private String urlPrefix;
    
    @Autowired
    private BannerService bannerService;
    
    /**
     * 上传轮播图图片并自动保存到数据库
     * 
     * @param file 上传的图片文件
     * @param imageName 图片名称（可选）
     * @param sortOrder 排序顺序（默认1）
     * @param status 状态（默认1）
     * @return 轮播图信息
     */
    @PostMapping("/banner")
    public R<Banner> uploadBannerImage(@RequestParam("file") MultipartFile file,
                                       @RequestParam(value = "imageName", required = false) String imageName,
                                       @RequestParam(value = "sortOrder", defaultValue = "1") Integer sortOrder,
                                       @RequestParam(value = "status", defaultValue = "1") Integer status) {
        try {
            // 检查文件是否为空
            if (file.isEmpty()) {
                return R.badRequest("请选择要上传的图片");
            }
            
            // 检查文件类型
            String contentType = file.getContentType();
            if (contentType == null || !contentType.startsWith("image/")) {
                return R.badRequest("只能上传图片文件");
            }
            
            // 检查文件大小（限制为5MB）
            if (file.getSize() > 5 * 1024 * 1024) {
                return R.badRequest("图片大小不能超过5MB");
            }
            
            // 确保上传目录存在
            Path uploadDir = Paths.get(uploadPath);
            if (!Files.exists(uploadDir)) {
                Files.createDirectories(uploadDir);
            }
            
            // 生成唯一文件名
            String originalFilename = file.getOriginalFilename();
            String extension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }
            String filename = UUID.randomUUID().toString() + extension;
            
            // 保存文件到static/images/banner目录
            Path filePath = uploadDir.resolve(filename);
            Files.copy(file.getInputStream(), filePath);
            
            // 返回文件访问URL（相对于静态资源路径）
            String fileUrl = urlPrefix + "/" + filename;
            
            // 如果没有提供图片名称，使用原始文件名
            if (imageName == null || imageName.trim().isEmpty()) {
                imageName = originalFilename != null ? originalFilename : "轮播图";
            }
            
            // 创建Banner对象并保存到数据库
            Banner banner = new Banner();
            banner.setImageUrl(fileUrl);
            banner.setImageName(imageName);
            banner.setSortOrder(sortOrder);
            banner.setStatus(status);
            
            boolean success = bannerService.addBanner(banner);
            if (success) {
                return R.success("图片上传并保存成功", banner);
            } else {
                return R.error("图片上传失败");
            }
            
        } catch (IOException e) {
            e.printStackTrace();
            return R.error("文件上传失败：" + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            return R.error("图片上传失败：" + e.getMessage());
        }
    }

    /**
     * 删除轮播图图片文件
     * 
     * @param filename 文件名
     * @return 操作结果
     */
    @DeleteMapping("/banner/{filename}")
    public R<String> deleteBannerImage(@PathVariable String filename) {
        try {
            Path filePath = Paths.get(uploadPath, filename);
            
            if (Files.exists(filePath)) {
                Files.delete(filePath);
                return R.success("文件删除成功");
            } else {
                return R.notFound("文件不存在");
            }
            
        } catch (IOException e) {
            e.printStackTrace();
            return R.error("文件删除失败：" + e.getMessage());
        }
    }
} 